home *** CD-ROM | disk | FTP | other *** search
- OPT OSVERSION=37
- OPT REG=5
-
-
- ->/////////////////////////////////////////////////////////////////////////////
- ->////////////////////////////////////////////////////// External modules /////
- ->/////////////////////////////////////////////////////////////////////////////
- MODULE 'dos/dos' , 'dos/exall'
-
-
- ->/////////////////////////////////////////////////////////////////////////////
- ->//////////////////////////////////////////////////// Exception handling /////
- ->/////////////////////////////////////////////////////////////////////////////
- RAISE "ARGS" IF ReadArgs() = NIL ,
- "MEM" IF String() = NIL ,
- "DOS" IF Open() = NIL ,
- "DOS" IF Read() = -1 ,
- "DOS" IF Fwrite() <> 1 ,
- "DOS" IF Lock() = 0 ,
- "DOS" IF AllocDosObject() = NIL ,
- "^C" IF CtrlC() = TRUE
-
-
- ->/////////////////////////////////////////////////////////////////////////////
- ->////////////////////////////////////////////////// Constant definitions /////
- ->/////////////////////////////////////////////////////////////////////////////
- ENUM FIND_STR , REPLACE_STR , FILES ,
- NUMBER_ARGS
-
-
- ->/////////////////////////////////////////////////////////////////////////////
- ->/////////////////////////////////////////// Global variable definitions /////
- ->/////////////////////////////////////////////////////////////////////////////
- DEF find_str : PTR TO CHAR
- DEF replace_str : PTR TO CHAR
-
-
- ->/////////////////////////////////////////////////////////////////////////////
- ->//////////////////////////////////////////////////////// Main procedure /////
- ->/////////////////////////////////////////////////////////////////////////////
- PROC main() HANDLE
-
- DEF rdargs = NIL , args : PTR TO LONG
- DEF files : PTR TO LONG , filename : PTR TO CHAR
- DEF file = NIL , file_start , file_length , file_end
- DEF old_dir_lock = NIL , dir_lock = NIL
-
- PrintF( ' \c1;33;40\cMultiFR\c0;31;40\c v1.0\n' , $9B , $6D , $9B , $6D )
- PutStr( 'Copyright © 1995, Lionel Vintenat\n' )
- PrintF( '\c1;32;40\c---------------------------------\c0;31;40\c\n' , $9B , $6D , $9B , $6D )
-
- rdargs := ReadArgs( 'FIND_STR/A,REPLACE_STR/A,FILES/M/A' , NEW args[ NUMBER_ARGS ] , NIL )
-
- find_str := String( StrLen( args[ FIND_STR ] ) )
- StrCopy( find_str , args[ FIND_STR ] )
-
- replace_str := String( StrLen( args[ REPLACE_STR ] ) )
- StrCopy( replace_str , args[ REPLACE_STR ] )
-
- files := args[ FILES ]
-
- WHILE files[]
-
- filename , dir_lock := get_filenames( files[] )
- old_dir_lock := CurrentDir( dir_lock )
-
- WHILE filename
-
- CtrlC()
-
- file := Open( filename , OLDFILE )
- file_length := FileLength( filename )
- file_end := ( file_start := NewR( file_length ) ) + file_length
- Read( file , file_start , file_length )
- Close( file ) ; file := NIL
-
- file := Open( filename , NEWFILE )
- PutStr( filename )
- parse_file( file , file_start , file_end )
- Close( file ) ; file := NIL
-
- Dispose( file_start )
-
- filename := Next( filename )
-
- ENDWHILE
-
- CurrentDir( old_dir_lock ) ; old_dir_lock := NIL
- UnLock( dir_lock ) ; dir_lock := NIL
-
- files++
-
- ENDWHILE
-
- EXCEPT DO
-
- SELECT exception
- CASE "ARGS"
- PrintFault( IoErr() , NIL )
- CASE "MEM"
- PutStr( 'Out of memory !\n' )
- CASE "DOS"
- PrintFault( IoErr() , NIL )
- CASE "^C"
- PutStr( '***user break***\n' )
- ENDSELECT
-
- IF old_dir_lock THEN CurrentDir( old_dir_lock )
- IF dir_lock THEN UnLock( dir_lock )
- IF file THEN Close( file )
- IF rdargs THEN FreeArgs( rdargs )
-
- ENDPROC
-
-
- ->/////////////////////////////////////////////////////////////////////////////
- ->//////////////////////////////////////////////////////// Version string /////
- ->/////////////////////////////////////////////////////////////////////////////
- CHAR '$VER: MultiFR 1.0 (14.4.95)'
-
-
- ->/////////////////////////////////////////////////////////////////////////////
- ->//////////////////////////////////////// Parses a file pattern argument /////
- ->/////////////////////////////////////////////////////////////////////////////
- PROC get_filenames( path_pattern ) HANDLE
-
- DEF pattern , path : PTR TO CHAR , dospattern : PTR TO CHAR
- DEF filenames = NIL , dir_lock
- DEF eac = NIL : PTR TO exallcontrol , ead : PTR TO exalldata
- DEF buffer[ 2048 ] : ARRAY , more , i
-
- pattern := FilePart( path_pattern )
- NEW path[ pattern - path_pattern + 1 ]
- AstrCopy( path , path_pattern , pattern - path_pattern + 1 )
-
- dir_lock := Lock( path , ACCESS_READ )
- eac := AllocDosObject( DOS_EXALLCONTROL , NIL )
- NEW dospattern[ StrLen( pattern ) * 2 + 2 ]
- ParsePatternNoCase( pattern , dospattern , StrLen( pattern ) * 2 + 2 )
- eac.lastkey := NIL
- eac.matchstring := dospattern
- eac.matchfunc := NIL
-
- REPEAT
-
- more := ExAll( dir_lock , buffer , 2048 , ED_NAME , eac )
- ead := buffer
-
- FOR i := 1 TO eac.entries
-
- filenames := Link( String( StrLen( ead.name ) ) , filenames )
- StrCopy( filenames , ead.name )
-
- ead := ead.next
-
- ENDFOR
-
- UNTIL more = FALSE
-
- IF IoErr() <> ERROR_NO_MORE_ENTRIES THEN Raise( "DOS" )
-
- EXCEPT DO
-
- IF eac THEN FreeDosObject( DOS_EXALLCONTROL , eac )
- ReThrow()
-
- ENDPROC filenames , dir_lock
-
-
- ->/////////////////////////////////////////////////////////////////////////////
- ->//////////////////////////////////////// Applies Find/Replace to a file /////
- ->/////////////////////////////////////////////////////////////////////////////
- PROC parse_file( file , file_start , file_end )
-
- DEF file_ptr1 : PTR TO CHAR , file_ptr2 : PTR TO CHAR
-
- file_ptr1 := ( file_ptr2 := file_start )
-
- WHILE file_ptr2 < file_end
-
- IF StrCmp( find_str , file_ptr2 , EstrLen( find_str ) )
-
- Fwrite( file , file_ptr1 , file_ptr2 - file_ptr1 , 1 )
- Fwrite( file , replace_str , EstrLen( replace_str ) , 1 )
- file_ptr2 := file_ptr2 + EstrLen( find_str )
- file_ptr1 := file_ptr2
-
- PutStr( '.' )
-
- ELSE
-
- INC file_ptr2
-
- ENDIF
-
- ENDWHILE
-
- PutStr( '\n' )
-
- Fwrite( file , file_ptr1 , file_ptr2 - file_ptr1 , 1 )
-
- ENDPROC
-